﻿/*============================================
 * 类名 :PushTree
 * 描述 :描述树节点信息的类
 *   
 * 创建时间: 2009-11-2 23:42:12
 *============================================*/
using System;
using System.Collections.Generic;

using System.Text;

namespace 命题证明
{
    /// <summary>树节点</summary>
    class Node
    {
        #region "变量区"
        /// <summary>获取或设置这个节点是否有非操作，如果没有，则为true</summary>
        //public bool IsTrue { get; set; }

        /// <summary>获取或设置这个节点的左孩子节点</summary>
        public Node Left { get; set; }

        /// <summary>获取或设置这个节点的右孩子节点</summary>
        public Node Right { get; set; }

        /// <summary>这个节点的父节点，这个属性是为了替换作的准备</summary>
        public Node Parent { get; set; }

        /// <summary>在证明时，存储如何推理得到这个节点</summary>
        public ProveNode Tag { get; set; }

        #endregion

        /// <summary>检查节点是否和已替换过的节点有父子关系</summary>
        public bool IsRelation( Node other )
        {
            if ( other == null )
                return false;
            if ( IsRelation( this, other ) )
                return true;
            if ( IsRelation( this.Left, other ) )
                return true;
            if ( IsRelation( this.Right, other ) )
                return true;
            if ( IsRelation( this, other.Left ) )
                return true;
            if ( IsRelation( this, other.Right ) )
                return true;
            return false;
        }
        /// <summary>判断两个对象是否是引用的同一个实例 </summary> 
        bool IsRelation( object left, object right )
        {
            if ( object.ReferenceEquals( left, right ) )
                return true;
            return false;
        }
        /// <summary>判断两个节点是否完全相等，真值表层面上的相等 </summary> 
        public bool IsEqual( Node other )
        {
            return ( new Expression( ExpressionFactory.ConvertToMiddle( this ) ) ).Equals( new Expression( ExpressionFactory.ConvertToMiddle( other ) ) );
        }
        /// <summary>可以进行相反替换</summary>  
        public bool CanOppositionReplace( Node other )
        {
            return IsOpposition( other ) && !IsRelation( other );
        }
        /// <summary>判断两个节点是否互为相反数 </summary> 
        public bool IsOpposition( Node other )
        {
            bool t = ( new Expression( MainChar.Not.ToString() + ExpressionFactory.ConvertToMiddle( this ) ) ).Equals( new Expression( ExpressionFactory.ConvertToMiddle( other ) ) );
            return t;
        }


    }
}
